package com.itany.corejava.code16_反射;

import java.io.IOException;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.util.Properties;

/**
 * @author Miss Chen
 * @version 1.0
 * @date 2024年08月13日8:45
 */
public class EmpFactory {
    private static Properties p;
    static{
        p=new Properties();
        try {
            p.load(EmpFactory.class.getClassLoader().getResourceAsStream("emp.properties"));
        } catch (IOException e) {
            throw new ExceptionInInitializerError("加载资源文件出错");
        }
    }

    public static Emp getEmp() throws EmpCreateFailException {
        // emp.properties文件中的数据存储到properties集合中
        //通过反射，创建Emp对象

        //获取Emp的Class对象
        Class<Emp> c=Emp.class;
        try {
            //通过Class对象获取对应类的午餐构造方法创建对象
            Emp emp=c.newInstance();

            //获取Emo对象中所有的属性
            Field[] fields=c.getDeclaredFields();
            for(Field field:fields){

                //获取对应属性上的Value注解
               Value annotation= field.getAnnotation(Value.class);

               //将注解的值作为properties中的key
               String key=annotation.value();

               //根据key获取集合中对应的取值
                String val= (String) p.get(key);

                //取消权限控制检查
                field.setAccessible(true);

                //为属性赋值
                field.set(emp,val);
            }
            return emp;
        } catch (InstantiationException e) {
            e.printStackTrace();

            throw new EmpCreateFailException("Emp对象创建失败");
        } catch (IllegalAccessException e) {
            e.printStackTrace();
            throw new EmpCreateFailException("Emp对象创建失败");
        }


    }
}
